#ifndef CAR_H  // 防止头文件被重复包含  
#define CAR_H  
#include <iostream>
using namespace std;

#include <string>  
#include <vector>  
#include <fstream>  
#include <sstream>  
 

class SmartCar {  
private:  
    string _id;  // 小车编号   
    // 底盘信息
    struct Chassis {
        string id;  // 底盘编号
        string model;
        double wheelbase;
        double track;
        double groundClearance;
        double minTurningRadius;
        string driveForm;
        double maxRange;
        string type;
        double size;

        // 构造函数
        Chassis() {}

        // 属性的set方法
        void setID(const string& newId) ;
        void setModel(const string& newModel);
        void setWheelbase(double newWheelbase) ;
        void setTrack(double newTrack) ;
        void setGroundClearance(double newGroundClearance) ;
        void setMinTurningRadius(double newMinTurningRadius) ;
        void setDriveForm(const string& newDriveForm) ;
        void setMaxRange(double newMaxRange) ;
        void setType(const string& newType) ;
        void setSize(double newSize);

        // 屏幕输出
        void print();

        // 本地文件保存
        void save(ofstream& file) ;
    };
    Chassis chassis;

   // AGX套件信息
    struct AGXKit {
        std::string model;
        int ai;
        int cudaCores;
        int tensorCores;
        int videoMemory;
        int storage;

        // 构造函数
        AGXKit() {}

        // 属性的set方法
        void setModel(const std::string& newModel);
        void setAI(int newAI);
        void setCudaCores(int newCudaCores);
        void setTensorCores(int newTensorCores);
        void setVideoMemory(int newVideoMemory);
        void setStorage(int newStorage);

        // 屏幕输出
        void print();

        // 本地文件保存
        void save(std::ofstream& file);
    };
    AGXKit agxKit;

    // 双目摄像头信息
    struct StereoCamera {
        std::string model;
        std::string cameraType;
        std::string rgbResolution;
        int rgbFrameRate;
        std::string fov;
        int depthFrameRate;

        // 构造函数
        StereoCamera() {}

        // 属性的set方法
        void setModel(const std::string& newModel);
        void setCameraType(const std::string& newCameraType);
        void setRgbResolution(const std::string& newRgbResolution);
        void setRgbFrameRate(int newRgbFrameRate);
        void setFOV(const std::string& newFOV);
        void setDepthFrameRate(int newDepthFrameRate);

        // 屏幕输出
        void print();

        // 本地文件保存
        void save(std::ofstream& file);
    };
    StereoCamera stereoCamera;

    // 多线激光雷达信息
    struct LiDAR {
        std::string model;
        int channelCount;
        double range;
        double powerConsumption;

        // 构造函数
        LiDAR() {}

        // 属性的set方法
        void setModel(const std::string& newModel);
        void setChannelCount(int newChannelCount);
        void setRange(double newRange);
        void setPowerConsumption(double newPowerConsumption);

        // 屏幕输出
        void print();

        // 本地文件保存
        void save(std::ofstream& file);
    };
    LiDAR lidar;

    // 9轴陀螺仪信息
    struct Gyroscope {
        std::string model;
        std::string manufacturer;

        // 构造函数
        Gyroscope() {}

        // 属性的set方法
        void setModel(const std::string& newModel);
        void setManufacturer(const std::string& newManufacturer);

        // 屏幕输出
        void print();

        // 本地文件保存
        void save(std::ofstream& file);
    };
    Gyroscope gyroscope;

    // 液晶显示屏信息
    struct Display {
        double size;
        std::string model;

        // 构造函数
        Display() {}

        // 属性的set方法
        void setSize(double newSize);
        void setModel(const std::string& newModel);

        // 屏幕输出
        void print();

        // 本地文件保存
        void save(std::ofstream& file);
    };
    Display display;

    // 电池模块信息
    struct Battery {
        std::string parameters;
        double outputVoltage;
        std::string chargeTime;

        // 构造函数
        Battery() {}

        // 属性的set方法
        void setParameters(const std::string& newParameters);
        void setOutputVoltage(double newOutputVoltage);
        void setChargeTime(const std::string& newChargeTime);

        // 屏幕输出
        void print();

        // 本地文件保存
        void save(std::ofstream& file);
    };
    Battery battery;
    
public:  
    void set_CAR_ID(string id);   //设置小车编号
    string get_ID(); //返回小车编号
    void saveToFile(const string& filename,int sta);   //将信息保存至文件
    void SET_Chassis(); //设置底盘信息为默认值
    void SET_AGXKit(); //设置AGX套件信息为默认值
    void SET_StereoCamera(); //设置双目摄像头信息为默认值
    void SET_LiDAR(); //设置多线激光雷达信息为默认值
    void SET_Battery(); //设置电池模块信息为默认值
    void SET_Display(); //设置液晶显示屏信息为默认值
    void SET_Gyroscope();  //设置9轴陀螺仪信息为默认值
    
};

void printCarFromFile(const string& filePath,int sta);  //读取文件

#endif